import Joi from "joi";

// 商品ID验证
const productIdSchema = Joi.alternatives()
  .try(
    Joi.number().integer().positive(),
    Joi.string().pattern(/^\d+$/).message("ID必须是数字字符串")
  )
  .required()
  .messages({
    "alternatives.types": "ID必须是数字或数字字符串",
    "alternatives.match": "无效的ID格式",
  });

// 商品查询参数验证
export const getProductListSchema = Joi.object({
  name: Joi.string().trim().max(100).allow("", null).optional(),
  page: Joi.number().integer().min(1).default(1),
  limit: Joi.number().integer().min(1).max(100).default(10),
  search: Joi.string().trim().max(100).allow("", null).optional(),
  status: Joi.string()
    .valid("draft", "published", "archived")
    .allow("", null)
    .optional(),
  createTime: Joi.array().items(Joi.date()).allow("", null).optional(),
  category_id: Joi.alternatives()
    .try(Joi.number().integer().positive(), Joi.string().pattern(/^\d+$/))
    .allow("", null)
    .optional(),
  minPrice: Joi.number().min(0).allow("", null).optional(),
  maxPrice: Joi.number().min(0).allow("", null).optional(),
  sortBy: Joi.string()
    .valid("createdAt", "price", "salesCount", "name")
    .default("createdAt"),
  order: Joi.string().valid("asc", "desc").default("desc"),
});

// 批量删除商品验证
export const batchDeleteProductsSchema = Joi.object({
  ids: Joi.array().items(productIdSchema).min(1).required().messages({
    "array.base": "ID列表必须是一个数组",
    "array.min": "至少需要提供一个ID",
  }),
}).options({ convert: true });

// 商品创建验证
export const createProductSchema = Joi.object({
  name: Joi.string().min(2).max(100).required(),
  code: Joi.string().max(50).allow("", null).optional(),
  description: Joi.string().max(5000).allow("", null).optional(),
  price: Joi.number().positive().required(),
  costPrice: Joi.number().positive().allow("", null).optional(),
  slug: Joi.string().max(120).allow("", null).optional(),
  stock: Joi.number().integer().min(0).default(0),
  sku: Joi.string().max(50).allow("", null).optional(),
  sku_name: Joi.string().max(50).allow("", null).optional(),
  skus: Joi.array().items(Joi.object()).min(1).required(),
  thumbnail: Joi.string().uri().allow("", null).optional(),
  images: Joi.array().items(Joi.string().uri()).max(10).default([]),
  spec: Joi.alternatives()
    .try(
      Joi.object().pattern(Joi.string(), Joi.any()), // 接受对象
      Joi.string().custom((value, helpers) => {
        // 接受JSON字符串并自动转换
        try {
          return JSON.parse(value); // 尝试解析字符串
        } catch {
          return helpers.error("any.invalid"); // 解析失败报错
        }
      })
    )
    .default({})
    .messages({
      "any.invalid": '"spec"必须是有效的JSON对象或字符串',
    }),
  status: Joi.string().valid("draft", "published", "archived").default("draft"),
  videoUrl: Joi.string().uri().allow("", null).optional(),
  weight: Joi.number().positive().allow("", null).optional(),
  isFeatured: Joi.boolean().default(false),
  category_id: Joi.number().integer().positive().required(),
  metaTitle: Joi.string().max(100).allow("", null).optional(),
  metaDescription: Joi.string().max(200).allow("", null).optional(),
});

// 商品更新验证
export const updateProductSchema = Joi.object({
  name: Joi.string().min(2).max(100),
  code: Joi.string().max(50).allow("", null).optional(),
  description: Joi.string().max(5000).allow("", null).optional(),
  price: Joi.number().positive(),
  slug: Joi.string().max(120).allow("", null).optional(),
  costPrice: Joi.number().positive().allow("", null).optional(),
  stock: Joi.number().integer().min(0),
  sku: Joi.string().max(50).allow("", null).optional(),
  sku_name: Joi.string().max(50).allow("", null).optional(),
  skus: Joi.array().items(Joi.object()).min(1),
  thumbnail: Joi.string().uri().allow("", null).optional(),
  images: Joi.array().items(Joi.string().uri()).max(10),
  spec: Joi.alternatives()
    .try(
      Joi.object().pattern(Joi.string(), Joi.any()), // 接受对象
      Joi.string().custom((value, helpers) => {
        // 接受JSON字符串并自动转换
        try {
          return JSON.parse(value); // 尝试解析字符串
        } catch {
          return helpers.error("any.invalid"); // 解析失败报错
        }
      })
    )
    .default({})
    .messages({
      "any.invalid": '"spec"必须是有效的JSON对象或字符串',
    }),
  status: Joi.string().valid("draft", "published", "archived").default("draft"),
  videoUrl: Joi.string().uri().allow("", null).optional(),
  weight: Joi.number().positive().allow("", null).optional(),
  isFeatured: Joi.boolean(),
  category_id: Joi.number().integer().positive(),
  metaTitle: Joi.string().max(100).allow("", null).optional(),
  metaDescription: Joi.string().max(200).allow("", null).optional(),
}).min(1);

// 商品状态更新验证
export const updateProductStatusSchema = Joi.object({
  status: Joi.string().valid("draft", "published", "archived").required(),
});

// 规格类型创建验证

export const createSpecTypeSchema = Joi.object({
  name: Joi.string().required(),
  values: Joi.array().items(Joi.string()).required(),
  category_id: Joi.string().allow("", null).optional(),
  description: Joi.string().allow("", null).optional(),
  deleted_at: Joi.string().allow("", null).optional(),
}); 

// 规格类型更新验证
export const updateSpecTypeSchema= Joi.object({
  id: Joi.string(),
  name: Joi.string(),
  category_id: Joi.string().allow("", null).optional(),
  values: Joi.array().items(Joi.string()),
  description: Joi.string().allow("", null).optional(),
  deleted_at: Joi.string().allow("", null).optional(),
})


export { productIdSchema };
